package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ValueBoxBase.TextAlignment;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.ClaseEquipoPatronDTO;
import edu.shared.DTO.ClaseProductoDTO;
import edu.shared.DTO.ComponentePatronDTO;
import edu.shared.DTO.ElementoProductoDTO;
import edu.shared.DTO.EquipoPatronDTO;
import edu.shared.DTO.ListaDeMaterialesDTO;
import edu.shared.DTO.MaterialProductoDTO;
import edu.shared.DTO.OrdenFabricacionGeneralDTO;
import edu.shared.DTO.ProductoDTO;
import edu.shared.DTO.RenglonListaMaterialesDTO;
import edu.shared.DTO.RenglonOrdenPedidoDTO;
import edu.shared.DTO.SubclaseEquipoPatronDTO;

public class P_DefinirListaMateriales extends Composite {
	
	private TabPanel padre;
	private String tituloTab;
	
	private static final int CODIGO = 0;
	private static final int NOMBRE = 1;
	private static final int MEDIDA_VARIABLE_1 = 2;
	private static final int MEDIDA_VARIABLE_2 = 3;
	private static final int CANTIDAD = 4;
	private static final int ELIMINAR = 5;

	private IngenieriaServiceAsync ingenieriaService;
	
	TextBox codigoTB;
	TextBox nombreTB;
	TextBox planoTB;
	TextBox ultimaVersionTB;
	TextArea descripcionTecnicaTA;
	
	ListBox tipoCombo;
	
	Label claseMaterialLabel;
	ListBox claseMaterialCombo;
	Label materialLabel;
	ListBox materialCombo;
	Label elementoMaterialLabel;
	ListBox elementoMaterialCombo;
	Label medidaFijaLabel;
	ListBox medidaFijaCombo;
	Label medidaVariableLabel;
	TextBox medidaVariable1TB;
	Label porLb;
	TextBox medidaVariable2TB;
	
	Label claseEquipoComponenteLabel;
	ListBox claseEquipoComponenteCombo;
	Label subclaseEquipoComponenteLabel;
	ListBox subclaseEquipoComponenteCombo;
	Label componenteLabel;
	ListBox componenteCombo;
	Label planoEquipoComponenteLabel;
	ListBox planoEquipoComponenteCombo;
	Label descripcionTecnicaEquipoComponenteLabel;
	TextArea descripcionTecnicaEquipoComponenteTA;
	
	FlexTable materialEquiposYComponentesFT;
	
	TextBox cantidadTB;
	Button agregarRenglonBtn;
	Button guardarBtn;
	Button generarBtn;
	
	List<EquipoPatronDTO> equiposPatronDTO;
	List<ComponentePatronDTO> componentesPatronDTO;
	List<ElementoProductoDTO> elementosProductoDTO;
	List<ProductoDTO> productosDTO;
	ListaDeMaterialesDTO listaDeMaterialesDTO;
	
	LayoutPanel layoutPanel;
	String itemAnterior;
	String usuario;
	LinkedList<RenglonListaMaterialesDTO> renglonesListaMaterialesDTO = new LinkedList<RenglonListaMaterialesDTO>();
	
	public P_DefinirListaMateriales(TabPanel padre, String titulo, String codigoEquipoOComponente) {
		
		this.tituloTab = titulo;
		this.padre = padre;
		
		layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "915px");
		
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		int codigoClase = Integer.parseInt(codigoEquipoOComponente.split("-")[0].substring(0, 2));
		int codigoSubclase = Integer.parseInt(codigoEquipoOComponente.split("-")[0].substring(2, 4));
		String version = codigoEquipoOComponente.split("-")[1];
		int codigoComponente = Integer.parseInt(codigoEquipoOComponente.split("-")[2].substring(0, 2));
		int codigoSubcomponente = Integer.parseInt(codigoEquipoOComponente.split("-")[2].substring(2, 4));
		int plano = Integer.parseInt(codigoEquipoOComponente.split("-")[3]);
		
		if (Validaciones.equipoOComponente(codigoEquipoOComponente) == "EQUIPO") {
			
			ingenieriaService.buscarEquipoPatron(codigoClase, codigoSubclase, plano, version, new AsyncCallback<EquipoPatronDTO>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(EquipoPatronDTO result) {
					
					codigoTB.setText(Validaciones.rellenarCodigoEquipoPatron(result));
					nombreTB.setText(result.getNombreClase() + " - " + result.getNombreSubclase());
					planoTB.setText(String.valueOf(result.getPlano()));
					ultimaVersionTB.setText(result.getNroVersion());
					descripcionTecnicaTA.setText(result.getDescripcionTecnica());
					
					if(result.getEstadoListaMateriales().equals("FINAL"))
						guardarBtn.setEnabled(false);
					
					verListaMateriales(result.getIdListaDeMateriales());
				}
			});
		}
		else {
			
			ingenieriaService.buscarComponentePatron(codigoClase, codigoSubclase, version, codigoComponente, codigoSubcomponente, plano, new AsyncCallback<ComponentePatronDTO>(){
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(ComponentePatronDTO result) {
					
					codigoTB.setText(Validaciones.rellenarCodigoComponentePatron(result));
					nombreTB.setText(result.getNombre());
					planoTB.setText(String.valueOf(result.getPlano()));
					ultimaVersionTB.setText(result.getNroVersion());
					descripcionTecnicaTA.setText(result.getDescripcionTecnica());
					
					if(result.getEstadoListaMateriales().equals("FINAL"))
						guardarBtn.setEnabled(false);
					
					verListaMateriales(result.getIdListaMateriales());
				}
			});
		}
			
		
		//Sección donde se establece el detalle de la orden de pedido.
		
		Label detalleEquipoOComponenteLabel = new Label("DETALLE DEL EQUIPO O COMPONENTE PATRÓN");
		detalleEquipoOComponenteLabel.setStyleName("labelTitulo");
		layoutPanel.add(detalleEquipoOComponenteLabel);
		layoutPanel.setWidgetLeftWidth(detalleEquipoOComponenteLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(detalleEquipoOComponenteLabel, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label codigoLabel = new Label("CÓDIGO:");
		codigoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		codigoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(codigoLabel);
		layoutPanel.setWidgetLeftWidth(codigoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		codigoTB = new TextBox();
		layoutPanel.add(codigoTB);
		layoutPanel.setWidgetLeftWidth(codigoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(codigoTB, 65.0, Unit.PX, 32.0, Unit.PX);
		codigoTB.setEnabled(false);
		
		Label planoLabel = new Label("PLANO:");
		planoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		planoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(planoLabel);
		layoutPanel.setWidgetLeftWidth(planoLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		planoTB = new TextBox();
		layoutPanel.add(planoTB);
		layoutPanel.setWidgetLeftWidth(planoTB, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoTB, 100.0, Unit.PX, 32.0, Unit.PX);
		planoTB.setEnabled(false);
		
		Label descripcionTecnicaLabel = new Label("DESCRIPCIÓN TÉCNICA:");
		descripcionTecnicaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		descripcionTecnicaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(descripcionTecnicaLabel);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaLabel, 175.0, Unit.PX, 19.0, Unit.PX);
		
		descripcionTecnicaTA = new TextArea();
		layoutPanel.add(descripcionTecnicaTA);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaTA, 17.5, Unit.PCT, 77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaTA, 135.0, Unit.PX, 100.0, Unit.PX);
		descripcionTecnicaTA.setEnabled(false);
		
		Label nombreLabel = new Label("NOMBRE:");
		nombreLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		nombreLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(nombreLabel);
		layoutPanel.setWidgetLeftWidth(nombreLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreLabel, 70.0, Unit.PX, 19.0, Unit.PX);
		
		nombreTB = new TextBox();
		layoutPanel.add(nombreTB);
		layoutPanel.setWidgetLeftWidth(nombreTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(nombreTB, 65.0, Unit.PX, 32.0, Unit.PX);
		nombreTB.setEnabled(false);
		
		Label ultimaVersionLabel = new Label("ULTIMA VERSIÓN:");
		ultimaVersionLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		ultimaVersionLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(ultimaVersionLabel);
		layoutPanel.setWidgetLeftWidth(ultimaVersionLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaVersionLabel, 105.0, Unit.PX, 19.0, Unit.PX);
		
		ultimaVersionTB = new TextBox();
		layoutPanel.add(ultimaVersionTB);
		layoutPanel.setWidgetLeftWidth(ultimaVersionTB, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(ultimaVersionTB, 100.0, Unit.PX, 32.0, Unit.PX);
		ultimaVersionTB.setEnabled(false);
		
		//Sección donde se incluyen los materiales, los equipos y componentes a la lista de materiales.
		Label equiposYComponentesLabel = new Label("EQUIPOS, COMPONENTES Y MATERIALES A INCLUIR");
		equiposYComponentesLabel.setStyleName("labelTitulo");
		layoutPanel.add(equiposYComponentesLabel);
		layoutPanel.setWidgetLeftWidth(equiposYComponentesLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(equiposYComponentesLabel, 235.0, Unit.PX, 50.0, Unit.PX);
		
		Label tipoLabel = new Label("TIPO:");
		tipoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		tipoLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(tipoLabel);
		layoutPanel.setWidgetLeftWidth(tipoLabel, 4.0, Unit.PCT, 13.2, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tipoLabel, 290.0, Unit.PX, 19.0, Unit.PX);
		
		tipoCombo = new ListBox();
		layoutPanel.add(tipoCombo);
		layoutPanel.setWidgetLeftWidth(tipoCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tipoCombo, 285.0, Unit.PX, 32.0, Unit.PX);
		
		tipoCombo.addItem("EQUIPO");
		tipoCombo.addItem("COMPONENTE");
		tipoCombo.addItem("MATERIAL");
		
		//Si se cambia el tipo seleccionado, se modifican los campos mostrados.
		tipoCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				
				//Quitamos los widgets que no correspondan.
				if(itemAnterior.equals("EQUIPO")) {
					claseEquipoComponenteLabel.removeFromParent();
					claseEquipoComponenteCombo.removeFromParent();				
					subclaseEquipoComponenteLabel.removeFromParent();
					subclaseEquipoComponenteCombo.removeFromParent();
					planoEquipoComponenteLabel.removeFromParent();
					planoEquipoComponenteCombo.removeFromParent();
					descripcionTecnicaEquipoComponenteLabel.removeFromParent();
					descripcionTecnicaEquipoComponenteTA.removeFromParent();
				}
				
				else if(itemAnterior.equals("COMPONENTE")) {
					claseEquipoComponenteLabel.removeFromParent();
					claseEquipoComponenteCombo.removeFromParent();				
					subclaseEquipoComponenteLabel.removeFromParent();
					subclaseEquipoComponenteCombo.removeFromParent();
					componenteLabel.removeFromParent();
					componenteCombo.removeFromParent();
					planoEquipoComponenteLabel.removeFromParent();
					planoEquipoComponenteCombo.removeFromParent();
					descripcionTecnicaEquipoComponenteLabel.removeFromParent();
					descripcionTecnicaEquipoComponenteTA.removeFromParent();
				}
				
				else {
					claseMaterialLabel.removeFromParent();
					claseMaterialCombo.removeFromParent();
					elementoMaterialLabel.removeFromParent();
					elementoMaterialCombo.removeFromParent();
					materialLabel.removeFromParent();
					materialCombo.removeFromParent();
					medidaFijaLabel.removeFromParent();
					medidaFijaCombo.removeFromParent();
					medidaVariableLabel.removeFromParent();
					medidaVariable1TB.removeFromParent();
					porLb.removeFromParent();
					medidaVariable2TB.removeFromParent();
				}
				
				//Agregamos la sección correspondiente.
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
					itemAnterior = "EQUIPO";
					
					cargarSeccionEquipos();
					
					cargarComboClaseEquipo();
					
					//Que no se permita agregar un equipo que tenga alguno de estos campos vacíos.
					if((claseEquipoComponenteCombo.getItemCount() == 0)||(subclaseEquipoComponenteCombo.getItemCount() == 0)||(equiposPatronDTO.isEmpty()))
						agregarRenglonBtn.setEnabled(false);
					else
						agregarRenglonBtn.setEnabled(true);
				}
				
				else if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE")) {
					itemAnterior = "COMPONENTE";
					
					cargarSeccionComponentes();
					
					cargarComboClaseEquipoComponente();
					
					//Que no se permita agregar un componente que tenga alguno de estos campos vacíos.
					if((claseEquipoComponenteCombo.getItemCount() == 0)||(subclaseEquipoComponenteCombo.getItemCount() == 0)||(componenteCombo.getItemCount() == 0)||(componentesPatronDTO.isEmpty()))
						agregarRenglonBtn.setEnabled(false);
					else
						agregarRenglonBtn.setEnabled(true);
				}
				
				else {
					itemAnterior = "MATERIAL";
					
					cargarSeccionMateriales();
					
					cargarComboClase();
					
					medidaVariable1TB.setText("");
					medidaVariable2TB.setText("");
				}
			}
		});
		
		AbsolutePanel materialEquipoOComponenteAP = new AbsolutePanel();
		materialEquipoOComponenteAP.setStyleName("panelConBorde");
		layoutPanel.add(materialEquipoOComponenteAP);
		layoutPanel.setWidgetLeftWidth(materialEquipoOComponenteAP, 4.0, Unit.PCT, 92.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialEquipoOComponenteAP, 320.0, Unit.PX, 200.0, Unit.PX);
				
		Label cantidadLabel = new Label("CANTIDAD:");
		cantidadLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		cantidadLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(cantidadLabel);
		layoutPanel.setWidgetLeftWidth(cantidadLabel, 30.0, Unit.PCT, 7.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cantidadLabel, 540.0, Unit.PX, 19.0, Unit.PX);
		
		cantidadTB = new TextBox();
		layoutPanel.add(cantidadTB);
		layoutPanel.setWidgetLeftWidth(cantidadTB, 38.0, Unit.PCT, 15.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(cantidadTB, 535.0, Unit.PX, 32.0, Unit.PX);
		cantidadTB.setMaxLength(3);
		cantidadTB.setAlignment(TextAlignment.CENTER);
		
		agregarRenglonBtn = new Button("AGREGAR");
		layoutPanel.add(agregarRenglonBtn);
		layoutPanel.setWidgetLeftWidth(agregarRenglonBtn, 55.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(agregarRenglonBtn, 535.0, Unit.PX, 28.0, Unit.PX);
		
		//Si se agrega un renglón nuevo, se verifica si es un equipo o componente lo que se desea cargar.
		agregarRenglonBtn.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
									
				if (validarCampos()) {
					if (tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("MATERIAL")) {
						ProductoDTO productoDTO = productosDTO.get(medidaFijaCombo.getSelectedIndex());
						if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("SUPERFICIE"))
							cargarProducto(productoDTO, Integer.parseInt(cantidadTB.getText()), Double.parseDouble(medidaVariable1TB.getText()), Double.parseDouble(medidaVariable2TB.getText()));
						
						else if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("LONGITUD"))
							cargarProducto(productoDTO, Integer.parseInt(cantidadTB.getText()), Double.parseDouble(medidaVariable1TB.getText()), -1);
						
						else
							cargarProducto(productoDTO, Integer.parseInt(cantidadTB.getText()), -1, -1);
					}
					
					else if (tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO")) {
						EquipoPatronDTO equipoPatronDTO = equiposPatronDTO.get(planoEquipoComponenteCombo.getSelectedIndex());
						cargarEquipo(equipoPatronDTO, Integer.parseInt(cantidadTB.getText()));
					}
					
					else if (tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE")) {
						ComponentePatronDTO componentePatronDTO = componentesPatronDTO.get(planoEquipoComponenteCombo.getSelectedIndex());
						cargarComponente(componentePatronDTO, Integer.parseInt(cantidadTB.getText()));
					}			
				}
			}
		});
		
		
		//Sección de la tabla.
		ScrollPanel contenedorTablaSP = new ScrollPanel();
		contenedorTablaSP.setStyleName("tabla");
		layoutPanel.add(contenedorTablaSP);
		layoutPanel.setWidgetLeftWidth(contenedorTablaSP, 4.9, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(contenedorTablaSP, 570.0, Unit.PX, 250.0, Unit.PX);
		
		materialEquiposYComponentesFT = new FlexTable();
		contenedorTablaSP.setWidget(materialEquiposYComponentesFT);
		materialEquiposYComponentesFT.setSize("100%", "100%");
		
		materialEquiposYComponentesFT.setText(0, CODIGO, "CÓDIGO");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, CODIGO, "14%");
		materialEquiposYComponentesFT.setText(0, NOMBRE, "NOMBRE");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, NOMBRE, "40%");
		materialEquiposYComponentesFT.setText(0, MEDIDA_VARIABLE_1, "MEDIDA VARIABLE 1");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, MEDIDA_VARIABLE_1, "15%");
		materialEquiposYComponentesFT.setText(0, MEDIDA_VARIABLE_2, "MEDIDA VARIABLE 2");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, MEDIDA_VARIABLE_2, "15%");
		materialEquiposYComponentesFT.setText(0, CANTIDAD, "CANTIDAD");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, CANTIDAD, "8%");
		materialEquiposYComponentesFT.setText(0, ELIMINAR, "ELIMINAR");
		materialEquiposYComponentesFT.getCellFormatter().setWidth(0, ELIMINAR, "8%");
		materialEquiposYComponentesFT.getRowFormatter().addStyleName(0, "tablaEncabezado");	
		
		Label pieLabel = new Label("");
		pieLabel.setStyleName("labelTitulo");
		layoutPanel.add(pieLabel);
		layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(pieLabel, 820.0, Unit.PX, 50.0, Unit.PX);
		
		
		//Sección de los últimos botones.
		Button salirBtn = new Button("CANCELAR");
		layoutPanel.add(salirBtn);
		layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(salirBtn, 875.0, Unit.PX, 28.0, Unit.PX);
		
		salirBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar(event);
			}
		});
		
		generarBtn = new Button("FINAL");
		layoutPanel.add(generarBtn);
		layoutPanel.setWidgetRightWidth(generarBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(generarBtn, 875.0, Unit.PX, 28.0, Unit.PX);
		
		generarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				generarBtn.setEnabled(false);
				
				if (!hayEquiposOComponentesProvisorios()) {
					listaDeMaterialesDTO.setRenglonListaMaterialesesDTO(renglonesListaMaterialesDTO);
					guardarFinal();
				}
				else {
					
					Window.alert("La lista de materiales no puede ser guardada como final porque algún equipo o componente de su lista de materiales no está definido completamente.");
					generarBtn.setEnabled(true);
				}
			}
		});
		
		guardarBtn = new Button("PROVISORIA");
		layoutPanel.add(guardarBtn);
		layoutPanel.setWidgetRightWidth(guardarBtn, 30.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(guardarBtn, 875.0, Unit.PX, 28.0, Unit.PX);	
		
		guardarBtn.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				
				guardarBtn.setEnabled(false);
				
				listaDeMaterialesDTO.setRenglonListaMaterialesesDTO(renglonesListaMaterialesDTO);
				guardarProvisoria();
			}
		});
		
		itemAnterior = "EQUIPO";
		cargarSeccionEquipos();
		cargarComboClaseEquipo();
		
		//Creación de las listas a utilizar.
		equiposPatronDTO = new LinkedList<EquipoPatronDTO>();
		componentesPatronDTO = new LinkedList<ComponentePatronDTO>();
	}
	
	/**
	 * Método que carga la sección de la pantalla destinada a equipos.
	 */
	private void cargarSeccionEquipos() {
		
		claseEquipoComponenteLabel = new Label("CLASE DE EQUIPO:");
		claseEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(claseEquipoComponenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoComponenteLabel, 335.0, Unit.PX, 19.0, Unit.PX);
		
		claseEquipoComponenteCombo = new ListBox();
		layoutPanel.add(claseEquipoComponenteCombo);
		layoutPanel.setWidgetLeftWidth(claseEquipoComponenteCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoComponenteCombo, 330.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la clase de equipo seleccionada, listamos las subclases correspondientes.
		claseEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboSubclaseEquipoComponente();	
			}
		});
		
		subclaseEquipoComponenteLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoComponenteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoComponenteLabel, 335.0, Unit.PX, 19.0, Unit.PX);
		
		subclaseEquipoComponenteCombo = new ListBox();
		layoutPanel.add(subclaseEquipoComponenteCombo);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoComponenteCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoComponenteCombo, 330.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la subclase de equipo seleccionada, listamos los planos correspondientes.
		subclaseEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO"))
					cargarComboPlanoEquipo();              
				else if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE"))
					cargarComboComponente();              
			}
		});
		
		planoEquipoComponenteLabel = new Label("PLANO:");
		planoEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		planoEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(planoEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(planoEquipoComponenteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoEquipoComponenteLabel, 370.0, Unit.PX, 19.0, Unit.PX);
		
		planoEquipoComponenteCombo = new ListBox();
		layoutPanel.add(planoEquipoComponenteCombo);
		layoutPanel.setWidgetLeftWidth(planoEquipoComponenteCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoEquipoComponenteCombo, 365.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el plano de componente seleccionado, mostramos su descripción técnica correspondiente.
		planoEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO"))
					descripcionTecnicaEquipoComponenteTA.setText(equiposPatronDTO.get(planoEquipoComponenteCombo.getSelectedIndex()).getDescripcionTecnica());
				else if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE"))
					descripcionTecnicaEquipoComponenteTA.setText(componentesPatronDTO.get(planoEquipoComponenteCombo.getSelectedIndex()).getDescripcionTecnica());
			}
		});
		
		descripcionTecnicaEquipoComponenteLabel = new Label("DESCRIPCIÓN TÉCNICA:");
		descripcionTecnicaEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		descripcionTecnicaEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(descripcionTecnicaEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaEquipoComponenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaEquipoComponenteLabel, 440.0, Unit.PX, 19.0, Unit.PX);
		
		descripcionTecnicaEquipoComponenteTA = new TextArea();
		descripcionTecnicaEquipoComponenteTA.setEnabled(false);
		layoutPanel.add(descripcionTecnicaEquipoComponenteTA);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaEquipoComponenteTA, 17.5, Unit.PCT, 77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaEquipoComponenteTA, 400.0, Unit.PX, 100.0, Unit.PX);
		
	}
	
	/**
	 * Método que carga la sección de la pantalla destinada a componentes.
	 */
	private void cargarSeccionComponentes() {
		
		claseEquipoComponenteLabel = new Label("CLASE DE EQUIPO:");
		claseEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(claseEquipoComponenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoComponenteLabel, 335.0, Unit.PX, 19.0, Unit.PX);
		
		claseEquipoComponenteCombo = new ListBox();
		layoutPanel.add(claseEquipoComponenteCombo);
		layoutPanel.setWidgetLeftWidth(claseEquipoComponenteCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseEquipoComponenteCombo, 330.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la clase de equipo seleccionada, listamos las subclases correspondientes.
		claseEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboSubclaseEquipoComponente();	
			}
		});
		
		subclaseEquipoComponenteLabel = new Label("SUBCLASE DE EQUIPO:");
		subclaseEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		subclaseEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(subclaseEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoComponenteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoComponenteLabel, 335.0, Unit.PX, 19.0, Unit.PX);
		
		subclaseEquipoComponenteCombo = new ListBox();
		layoutPanel.add(subclaseEquipoComponenteCombo);
		layoutPanel.setWidgetLeftWidth(subclaseEquipoComponenteCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(subclaseEquipoComponenteCombo, 330.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la subclase de equipo seleccionada, listamos los planos correspondientes.
		subclaseEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO"))
					cargarComboPlanoEquipo();              
				else if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE"))
					cargarComboComponente();              
			}
		});
		
		componenteLabel = new Label("COMPONENTE:");
		componenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		componenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(componenteLabel);
		layoutPanel.setWidgetLeftWidth(componenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteLabel, 370.0, Unit.PX, 19.0, Unit.PX);
		
		componenteCombo = new ListBox();
		layoutPanel.add(componenteCombo);
		layoutPanel.setWidgetLeftWidth(componenteCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(componenteCombo, 365.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el componente seleccionado, listamos los planos correspondientes.
		componenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboPlanoComponente();              
			}
		});
		
		planoEquipoComponenteLabel = new Label("PLANO:");
		planoEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		planoEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(planoEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(planoEquipoComponenteLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoEquipoComponenteLabel, 370.0, Unit.PX, 19.0, Unit.PX);
		
		planoEquipoComponenteCombo = new ListBox();
		layoutPanel.add(planoEquipoComponenteCombo);
		layoutPanel.setWidgetLeftWidth(planoEquipoComponenteCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(planoEquipoComponenteCombo, 365.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el plano de componente seleccionado, mostramos su descripción técnica correspondiente.
		planoEquipoComponenteCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("EQUIPO"))
					descripcionTecnicaEquipoComponenteTA.setText(equiposPatronDTO.get(planoEquipoComponenteCombo.getSelectedIndex()).getDescripcionTecnica());
				else if(tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("COMPONENTE"))
					descripcionTecnicaEquipoComponenteTA.setText(componentesPatronDTO.get(planoEquipoComponenteCombo.getSelectedIndex()).getDescripcionTecnica());
			}
		});
		
		descripcionTecnicaEquipoComponenteLabel = new Label("DESCRIPCIÓN TÉCNICA:");
		descripcionTecnicaEquipoComponenteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		descripcionTecnicaEquipoComponenteLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(descripcionTecnicaEquipoComponenteLabel);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaEquipoComponenteLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaEquipoComponenteLabel, 440.0, Unit.PX, 19.0, Unit.PX);
		
		descripcionTecnicaEquipoComponenteTA = new TextArea();
		descripcionTecnicaEquipoComponenteTA.setEnabled(false);
		layoutPanel.add(descripcionTecnicaEquipoComponenteTA);
		layoutPanel.setWidgetLeftWidth(descripcionTecnicaEquipoComponenteTA, 17.5, Unit.PCT, 77.5, Unit.PCT);
		layoutPanel.setWidgetTopHeight(descripcionTecnicaEquipoComponenteTA, 400.0, Unit.PX, 100.0, Unit.PX);
	}
	
	
	/**
	 * Método que carga la sección de la pantalla destinada a materiales.
	 */
	private void cargarSeccionMateriales() {
		
		claseMaterialLabel = new Label("CLASE:");
		claseMaterialLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		claseMaterialLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(claseMaterialLabel);
		layoutPanel.setWidgetLeftWidth(claseMaterialLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseMaterialLabel, 370.0, Unit.PX, 19.0, Unit.PX);
		
		claseMaterialCombo = new ListBox();
		layoutPanel.add(claseMaterialCombo);
		layoutPanel.setWidgetLeftWidth(claseMaterialCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(claseMaterialCombo, 365.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia la clase de material seleccionada, listamos los elementos correspondientes.
		claseMaterialCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboElemento();
			}
		});
		
		materialLabel = new Label("MATERIAL:");
		materialLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		materialLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(materialLabel);
		layoutPanel.setWidgetLeftWidth(materialLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialLabel, 370.0, Unit.PX, 19.0, Unit.PX);
		
		materialCombo = new ListBox();
		layoutPanel.add(materialCombo);
		layoutPanel.setWidgetLeftWidth(materialCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(materialCombo, 365.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el material seleccionado, listamos las medidas fijas correspondientes.
		materialCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboMedidaFija();
			}
		});
		
		elementoMaterialLabel = new Label("ELEMENTO:");
		elementoMaterialLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		elementoMaterialLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(elementoMaterialLabel);
		layoutPanel.setWidgetLeftWidth(elementoMaterialLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoMaterialLabel, 405.0, Unit.PX, 19.0, Unit.PX);
		
		elementoMaterialCombo = new ListBox();
		layoutPanel.add(elementoMaterialCombo);
		layoutPanel.setWidgetLeftWidth(elementoMaterialCombo, 17.5, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(elementoMaterialCombo, 400.0, Unit.PX, 32.0, Unit.PX);
		
		//Si se cambia el elemento seleccionado, listamos los materiales correspondientes.
		elementoMaterialCombo.addChangeHandler(new ChangeHandler() {
			public void onChange(ChangeEvent event) {
				cargarComboMaterial();
				
				medidaVariable1TB.setEnabled(true);
				medidaVariable2TB.setEnabled(true);
				
				if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("UNIDAD")) {
					medidaVariable1TB.setEnabled(false);
					medidaVariable2TB.setEnabled(false);
				}
				
				if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("LONGITUD")) {
					medidaVariable2TB.setEnabled(false);
				}
			}
		});
		
		medidaFijaLabel = new Label("MEDIDA FIJA:");
		medidaFijaLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		medidaFijaLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(medidaFijaLabel);
		layoutPanel.setWidgetLeftWidth(medidaFijaLabel, 50.0, Unit.PCT, 19.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaLabel, 405.0, Unit.PX, 19.0, Unit.PX);
		
		medidaFijaCombo = new ListBox();
		layoutPanel.add(medidaFijaCombo);
		layoutPanel.setWidgetLeftWidth(medidaFijaCombo, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaFijaCombo, 400.0, Unit.PX, 32.0, Unit.PX);
		
		medidaVariableLabel = new Label("MEDIDA VARIABLE:");
		medidaVariableLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		medidaVariableLabel.setStyleName("gwt-LabelFormulario");
		layoutPanel.add(medidaVariableLabel);
		layoutPanel.setWidgetLeftWidth(medidaVariableLabel, 0.0, Unit.PCT, 17.3, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaVariableLabel, 440.0, Unit.PX, 19.0, Unit.PX);
		
		medidaVariable1TB = new TextBox();
		layoutPanel.add(medidaVariable1TB);
		layoutPanel.setWidgetLeftWidth(medidaVariable1TB, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaVariable1TB, 435.0, Unit.PX, 32.0, Unit.PX);
				
		porLb = new Label("X");
		porLb.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		layoutPanel.add(porLb);
		layoutPanel.setWidgetLeftWidth(porLb, 27.5, Unit.PCT, 5.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(porLb, 440.0, Unit.PX, 19.0, Unit.PX);
		
		medidaVariable2TB = new TextBox();
		layoutPanel.add(medidaVariable2TB);
		layoutPanel.setWidgetLeftWidth(medidaVariable2TB, 32.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(medidaVariable2TB, 435.0, Unit.PX, 32.0, Unit.PX);	
		
	}
	
	/**
	 * Méetodo que carga el combobox de clases de productos.
	 */
	private void cargarComboClase() {
		
		claseMaterialCombo.clear();
		
		ingenieriaService.buscarClasesProducto(new AsyncCallback<List<ClaseProductoDTO>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseProductoDTO> result) {
				//Cargamos el comboBox con las clases de material existentes, mostrando código y nombre de la clase.
				for(ClaseProductoDTO claseProducto : result)
					claseMaterialCombo.addItem(Validaciones.rellenarCodigo(claseProducto.getCodigo()) + " - " + claseProducto.getNombre());
				
				//cargamos el combobox de elementos con los elementos pertenecientes a la clase seleccionada
				cargarComboElemento();
			}
		});
	}
	
	/**
	 * Método que carga el combobox de elementos de productos
	 */
	private void cargarComboElemento() {

		elementoMaterialCombo.clear();
		
		//Si no existe ninguna clase de material cargada, que no busque elementos.
		if(claseMaterialCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClase = Integer.parseInt((claseMaterialCombo.getItemText(claseMaterialCombo.getSelectedIndex()).split(" - "))[0]);
					
		
			ingenieriaService.buscarElementosProducto(codigoClase, new AsyncCallback<List<ElementoProductoDTO>>() {
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<ElementoProductoDTO> result) {
					
					elementosProductoDTO = result;
					
					for(ElementoProductoDTO elementoProducto : result)
						elementoMaterialCombo.addItem(Validaciones.rellenarCodigo(elementoProducto.getCodigo()) + " - " + elementoProducto.getNombre());
					
					if (elementosProductoDTO.size() > 0) {
						medidaVariable1TB.setEnabled(true);
						medidaVariable2TB.setEnabled(true);
						
						if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("UNIDAD")) {
							medidaVariable1TB.setEnabled(false);
							medidaVariable2TB.setEnabled(false);
						}
						
						if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("LONGITUD")) {
							medidaVariable2TB.setEnabled(false);
						}
					}

					//cargamos el combobox de materiales con los materiales pertenecientes a la clase y elemento seleccionados.
					cargarComboMaterial();
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	
	/**
	 * Método que carga el combobox de materiales de producto.
	 */
	private void cargarComboMaterial() {
		
		materialCombo.clear();
		
		//Si no existe ningun elemento de material cargado, que no busque materiales.
		if(elementoMaterialCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClase = Integer.parseInt((claseMaterialCombo.getItemText(claseMaterialCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoElemento = Integer.parseInt((elementoMaterialCombo.getItemText(elementoMaterialCombo.getSelectedIndex()).split(" - "))[0]);

			ingenieriaService.buscarMaterialesProducto(codigoClase, codigoElemento, new AsyncCallback<List<MaterialProductoDTO>>() {
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");	
				}
	
				@Override
				public void onSuccess(List<MaterialProductoDTO> result) {
					
					for(MaterialProductoDTO materialProducto : result)
						materialCombo.addItem(Validaciones.rellenarCodigo(materialProducto.getCodigo()) + " - " + materialProducto.getNombre());
					
					cargarComboMedidaFija();
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	
	/**
	 * Método que carga el combobox de materiales de producto.
	 */
	private void cargarComboMedidaFija() {
		
		medidaFijaCombo.clear();
		
		//Si no existe ningun elemento de material cargado, que no busque materiales.
		if(materialCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClase = Integer.parseInt((claseMaterialCombo.getItemText(claseMaterialCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoElemento = Integer.parseInt((elementoMaterialCombo.getItemText(elementoMaterialCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoMaterial = Integer.parseInt((materialCombo.getItemText(materialCombo.getSelectedIndex()).split(" - "))[0]);

			ingenieriaService.buscarProductos(codigoClase, codigoElemento, codigoMaterial, new AsyncCallback<List<ProductoDTO>>() {
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");	
				}
	
				@Override
				public void onSuccess(List<ProductoDTO> result) {
					
					productosDTO = result;
					
					for(ProductoDTO producto : result)
						medidaFijaCombo.addItem(Validaciones.rellenarCodigo(producto.getMedidaFija().getCodigo()) + " - " + producto.getMedidaFija().getMedida());
					
					if (medidaFijaCombo.getItemCount() == 0) {
						agregarRenglonBtn.setEnabled(false);
					}
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo con todas las clases existentes.
	 */
	private void cargarComboClaseEquipo() {
		
		claseEquipoComponenteCombo.clear();
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipo();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipo() {
		
		subclaseEquipoComponenteCombo.clear();
		
		//Si no existe ninguna clase de equipo cargada, que no busque subclases.
		if(claseEquipoComponenteCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los planos pertenecientes a una clase y subclase de equipo particular.
					cargarComboPlanoEquipo();
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los planos existentes con la última versión para un equipo particular.
	 */
	private void cargarComboPlanoEquipo() {
		
		equiposPatronDTO.clear();
		planoEquipoComponenteCombo.clear();
		
		if (subclaseEquipoComponenteCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
		
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
					
			ingenieriaService.buscarPlanosEquipoPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<EquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<EquipoPatronDTO> result) {
					
					//Cargamos el comboBox con los planos de equipo patron existentes, mostrando código.
					for(EquipoPatronDTO equipoPatronDTO : result) {
						planoEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(equipoPatronDTO.getPlano()));
						equiposPatronDTO.add(equipoPatronDTO);
					}
	
					//Si no existen equipos patrones para esta clase, que envíe un mensaje.
					if (!equiposPatronDTO.isEmpty())
						descripcionTecnicaEquipoComponenteTA.setText(equiposPatronDTO.get(0).getDescripcionTecnica());
					else {
						descripcionTecnicaEquipoComponenteTA.setText("");
						agregarRenglonBtn.setEnabled(false);
					}
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	
	/**
	 * Método que permite cargar el comboBox de las clases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboClaseEquipoComponente() {
		
		claseEquipoComponenteCombo.clear();
		
		ingenieriaService.buscarClasesEquipoPatron(new AsyncCallback<List<ClaseEquipoPatronDTO>>(){

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO.");
			}

			@Override
			public void onSuccess(List<ClaseEquipoPatronDTO> result) {
				//Cargamos el comboBox con las clases de equipo patron existentes, mostrando código y nombre de la clase.
				for(ClaseEquipoPatronDTO claseEquipoPatronDTO : result)
					claseEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(claseEquipoPatronDTO.getCodigoClaseEquipoPatron()) + " - " + claseEquipoPatronDTO.getNombre());
				
				//cargamos el comboBox de subclases con las subclases pertenecientes a la clase seleccionada
				cargarComboSubclaseEquipoComponente();
			}
		});
	}
	
	/**
	 * Método que permite cargar el comboBox de las subclases de equipo para componente con todas las clases existentes.
	 */
	private void cargarComboSubclaseEquipoComponente() {
		
		subclaseEquipoComponenteCombo.clear();
		
		//Si no existe ninguna clase de equipo cargada, que no busque subclases.
		if(claseEquipoComponenteCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarSubclasesEquipoPatron(codigoClaseEquipoPatron, new AsyncCallback<List<SubclaseEquipoPatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<SubclaseEquipoPatronDTO> result) {					
					//Cargamos el comboBox con las subclases de equipo patron existentes para un componente, mostrando código y nombre de la subclase.
					for(SubclaseEquipoPatronDTO subclaseEquipoPatronDTO : result)
						subclaseEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(subclaseEquipoPatronDTO.getCodigoSubclase()) + " - " + subclaseEquipoPatronDTO.getNombre());
					
					//Cargamos todos los componentes pertenecientes a una clase y subclase de equipo particular.
					cargarComboComponente();
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los componentes existentes.
	 */
	private void cargarComboComponente() {
		
		componenteCombo.clear();
		
		//Si no existe ninguna subclase de equipo cargada, que no busque componentes.
		if(claseEquipoComponenteCombo.getItemCount() > 0) {
			
			agregarRenglonBtn.setEnabled(true);

			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			
			ingenieriaService.buscarComponentesPatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
				
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {
										
					//Cargamos el comboBox con los componentes patron existentes, mostrando código y nombre .
					for(ComponentePatronDTO componentePatronDTO : result) {
						componenteCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getCodigoComponente()) + Validaciones.rellenarCodigo(componentePatronDTO.getCodigoSubcomponente()) + " - " + componentePatronDTO.getNombre());
					}
	
					//Cargamos el comboBox con los planos pertenecientes a un componente particular.
					cargarComboPlanoComponente();
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	/**
	 * Método que permite cargar el comboBox de los planos existentes con la última versión para un componente particular.
	 */
	private void cargarComboPlanoComponente() {
		
		componentesPatronDTO.clear();
		planoEquipoComponenteCombo.clear();
		
		if (componenteCombo.getItemCount() > 0) {
			
			int codigoClaseEquipoPatron = Integer.parseInt((claseEquipoComponenteCombo.getItemText(claseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoSubclaseEquipoPatron = Integer.parseInt((subclaseEquipoComponenteCombo.getItemText(subclaseEquipoComponenteCombo.getSelectedIndex()).split(" - "))[0]);
			int codigoComponente = Integer.parseInt((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(0, 2)));
			int codigoSubcomponente = Integer.parseInt((componenteCombo.getItemText(componenteCombo.getSelectedIndex()).substring(2, 4)));
			
			agregarRenglonBtn.setEnabled(true);
					
			ingenieriaService.buscarPlanosComponentePatron(codigoClaseEquipoPatron, codigoSubclaseEquipoPatron, codigoComponente, codigoSubcomponente, new AsyncCallback<List<ComponentePatronDTO>>(){
	
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(List<ComponentePatronDTO> result) {
										
					//Cargamos el comboBox con los planos de equipo patron existentes, mostrando código.
					for(ComponentePatronDTO componentePatronDTO : result) {
						planoEquipoComponenteCombo.addItem(Validaciones.rellenarCodigo(componentePatronDTO.getPlano()));
						componentesPatronDTO.add(componentePatronDTO);
					}
	
					//Si no existen equipos patrones para esta clase, que envíe un mensaje.
					if (!componentesPatronDTO.isEmpty())
						descripcionTecnicaEquipoComponenteTA.setText(componentesPatronDTO.get(0).getDescripcionTecnica());
					else {
						descripcionTecnicaEquipoComponenteTA.setText("");
						agregarRenglonBtn.setEnabled(false);
					}
				}
			});
		}
		else {
			agregarRenglonBtn.setEnabled(false);
		}
	}
	
	public void verListaMateriales(int idListaMateriales) {
		
		ingenieriaService.buscarListaMateriales(idListaMateriales, new AsyncCallback<ListaDeMaterialesDTO>(){
				
				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO.");
				}
	
				@Override
				public void onSuccess(ListaDeMaterialesDTO result) {
					
					listaDeMaterialesDTO = result;
					
					for (RenglonListaMaterialesDTO renglon : result.getRenglonListaMaterialesesDTO()) {
						
						if (renglon.getEquipoPatronDTO() != null)
							cargarEquipo(renglon.getEquipoPatronDTO(), renglon.getCantidad());
						else if (renglon.getComponentePatronDTO() != null)
							cargarComponente(renglon.getComponentePatronDTO(), renglon.getCantidad());
						else {
							if (renglon.getProductoDTO().getElemento().getTipoDimension().equals("SUPERFICIE"))
								cargarProducto(renglon.getProductoDTO(), renglon.getCantidad(), renglon.getMedida1(), renglon.getMedida2());
							
							else if(renglon.getProductoDTO().getElemento().getTipoDimension().equals("LONGITUD"))
								cargarProducto(renglon.getProductoDTO(), renglon.getCantidad(), renglon.getMedida1(), -1);
							
							else
								cargarProducto(renglon.getProductoDTO(), renglon.getCantidad(), -1, -1);
						}
							
					}
				}
			});
	}
	
	/**
	 * Método que carga un equipo que va a ser construido a la tabla de materiales, equipos y componentes.
	 */
	public void cargarProducto(ProductoDTO productoDTO, int cantidad, double medidaVariable1, double medidaVariable2) {
		
		RenglonListaMaterialesDTO renglon = new RenglonListaMaterialesDTO();
		
		//Se establece el tipo que hay en el renglón y su id.
		renglon.setProductoDTO(productoDTO);
		
		int filaSiguiente = materialEquiposYComponentesFT.getRowCount();
		
		//Se rellena el código de equipo para que tenga la longitud y formato adecuados.
		materialEquiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoProducto(productoDTO));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, NOMBRE, productoDTO.getElemento().getClase().getNombre() + " - " + 
					productoDTO.getElemento().getNombre() + " - " + productoDTO.getMaterial().getNombre());
		
		if(medidaVariable1 != -1){
			materialEquiposYComponentesFT.setText(filaSiguiente, MEDIDA_VARIABLE_1, String.valueOf(medidaVariable1));
			renglon.setMedida1(medidaVariable1);
		}
		
		else
			renglon.setMedida1(0.0);
		
		if(medidaVariable2 != -1) {
			materialEquiposYComponentesFT.setText(filaSiguiente, MEDIDA_VARIABLE_2, String.valueOf(medidaVariable2));
			renglon.setMedida2(medidaVariable2);
		}
		else
			renglon.setMedida2(0.0);
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(cantidad));
		renglon.setCantidad(cantidad);
		renglon.setTipoRenglon("MATERIAL");
		
		//Creamos el Label para eliminar y le seteamos su clickHandler.
		Label eliminarLb = new Label("");
		eliminarLb.setSize("16px", "16px");
		eliminarLb.setStyleName("labelBorrar");
		
		eliminarLb.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int aEliminar = materialEquiposYComponentesFT.getCellForEvent(event).getRowIndex();
				materialEquiposYComponentesFT.removeRow(aEliminar);
				renglonesListaMaterialesDTO.remove(aEliminar - 1);
			}
		});
		
		materialEquiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
		materialEquiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
		materialEquiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
		
		//Agregamos el renglón a la lista de renglones existente.
		renglonesListaMaterialesDTO.add(renglon);
		
		//Dejamos la pantalla lista para cargar un nuevo equipo o componente.
		cantidadTB.setText("");
	}
	
	
	/**
	 * Método que carga un equipo que va a ser construido a la tabla de materiales, equipos y componentes.
	 */
	public void cargarEquipo(EquipoPatronDTO equipoPatronDTO, int cantidad) {
		
		RenglonListaMaterialesDTO renglon = new RenglonListaMaterialesDTO();
		
		//Se establece el tipo que hay en el renglón y su id.
		renglon.setEquipoPatronDTO(equipoPatronDTO);
		
		int filaSiguiente = materialEquiposYComponentesFT.getRowCount();
		
		//Se rellena el código de equipo para que tenga la longitud y formato adecuados.
		materialEquiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoEquipoPatron(equipoPatronDTO));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, NOMBRE, equipoPatronDTO.getNombreClase() + " - " + equipoPatronDTO.getNombreSubclase());
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(cantidad));
		renglon.setCantidad(cantidad);
		renglon.setTipoRenglon("EQUIPO");
		
		//Creamos el Label para eliminar y le seteamos su clickHandler.
		Label eliminarLb = new Label("");
		eliminarLb.setSize("16px", "16px");
		eliminarLb.setStyleName("labelBorrar");
		
		eliminarLb.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int aEliminar = materialEquiposYComponentesFT.getCellForEvent(event).getRowIndex();
				materialEquiposYComponentesFT.removeRow(aEliminar);
				renglonesListaMaterialesDTO.remove(aEliminar - 1);
			}
		});
		
		materialEquiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
		materialEquiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
		materialEquiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
		
		//Agregamos el renglón a la lista de renglones existente.
		renglonesListaMaterialesDTO.add(renglon);
		
		//Dejamos la pantalla lista para cargar un nuevo equipo o componente.
		cantidadTB.setText("");
	}
	
	/**
	 * Método que carga un componente que va a ser construido a la tabla de materiales, equipos y componentes.
	 */
	public void cargarComponente(ComponentePatronDTO componentePatronDTO, int cantidad) {
				
		RenglonListaMaterialesDTO renglon = new RenglonListaMaterialesDTO();
		
		renglon.setComponentePatronDTO(componentePatronDTO);
		
		int filaSiguiente = materialEquiposYComponentesFT.getRowCount();

		//Se rellena el código de equipo para que tenga la longitud y formato adecuados.
		materialEquiposYComponentesFT.setText(filaSiguiente, CODIGO, Validaciones.rellenarCodigoComponentePatron(componentePatronDTO));
		
		materialEquiposYComponentesFT.setText(filaSiguiente, NOMBRE, componentePatronDTO.getNombre());
		
		materialEquiposYComponentesFT.setText(filaSiguiente, CANTIDAD, String.valueOf(cantidad));
		renglon.setCantidad(cantidad);		
		renglon.setTipoRenglon("COMPONENTE");
		
		//Creamos el Label para eliminar y le seteamos su clickHandler.
		Label eliminarLb = new Label("");
		eliminarLb.setSize("16px", "16px");
		eliminarLb.setStyleName("labelBorrar");
		
		eliminarLb.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				int aEliminar = materialEquiposYComponentesFT.getCellForEvent(event).getRowIndex();
				materialEquiposYComponentesFT.removeRow(aEliminar);
				renglonesListaMaterialesDTO.remove(aEliminar - 1);
			}
		});
		
		materialEquiposYComponentesFT.setWidget(filaSiguiente, ELIMINAR, eliminarLb);
		materialEquiposYComponentesFT.getFlexCellFormatter().setHorizontalAlignment(filaSiguiente, ELIMINAR, HasHorizontalAlignment.ALIGN_CENTER);
		materialEquiposYComponentesFT.getRowFormatter().setStyleName(filaSiguiente, "tablaRenglon");
		
		//Agregamos el renglón a la lista de renglones existente.
		renglonesListaMaterialesDTO.add(renglon);
		
		//Dejamos la pantalla lista para cargar un nuevo equipo o componente.
		cantidadTB.setText("");
	}
	
	public boolean validarCampos() {
		
		List<String> errores = new LinkedList<String>();
		String mensaje = "";
		boolean resultado = true;
		
		if (cantidadTB.getText().equals(""))
			errores.add("- La \"Cantidad\" no puede ser vacía.");
		
		else {
			try{
				Integer.parseInt(cantidadTB.getText());
				
				if (Integer.parseInt(cantidadTB.getText()) <= 0)
					throw new Exception();
			}
			
			catch(Exception e)
			{
				errores.add("- La \"Cantidad\" sólo puede ser un número entero positivo.");				
			}
		}
		
		if (tipoCombo.getItemText(tipoCombo.getSelectedIndex()).equals("MATERIAL")) {
			try{
				//si el elemento del material tiene dimensión unidad, las medidas variables puede quedar vacías
				if(!elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("UNIDAD"))
				{
					Double.parseDouble(medidaVariable1TB.getText());
					
					if (Double.parseDouble(medidaVariable1TB.getText()) <= 0)
						throw new Exception();
						
					if(elementosProductoDTO.get(elementoMaterialCombo.getSelectedIndex()).getTipoDimension().equals("SUPERFICIE")) {
	
						Double.parseDouble(medidaVariable2TB.getText());
						
						if (Double.parseDouble(medidaVariable2TB.getText()) <= 0)
							throw new Exception();
					}
				}
			}
			
			catch(Exception e)
			{
				errores.add("- Las \"Medidas Variables\" sólo pueden ser un número entero positivo.");				
			}
		}
				
		//Si hubo errores, armamos el mensaje de error.
		if(errores.size() > 0){
			resultado = false;
			
			mensaje = mensaje + errores.get(0);
			
			for(int i=1; i<errores.size(); i++)
				mensaje = mensaje + '\n' + '\n' + errores.get(i);
			
			Window.alert(mensaje);
		}
			
		return resultado;
	}
	
	
	/*
	 * Método que comprueba si dentro de la lista de materiales hay equipos o componentes cuya lista de materiales esté en estado provisoria.
	 * Si se da esto, esta lista de materiales no puede guardarse como final.
	 */
	private boolean hayEquiposOComponentesProvisorios() {
		
		boolean hayProvisorios = false;
		
		for (RenglonListaMaterialesDTO renglon: renglonesListaMaterialesDTO) {
			
			if(renglon.getTipoRenglon().equals("EQUIPO")) {
				if(renglon.getEquipoPatronDTO().getEstadoListaMateriales().equals("PROVISORIA"))
					hayProvisorios = true;
			}
			
			else if(renglon.getTipoRenglon().equals("COMPONENTE")) {
				if(renglon.getComponentePatronDTO().getEstadoListaMateriales().equals("PROVISORIA"))
					hayProvisorios = true;
			}
		}
	
		return hayProvisorios;
	}
	
	/*
	 * Método que actualiza el estado de las ordenes de fabricación a las que pertenece este equipo a FINAL, siempre y cuando sea el
	 * último equipo con su lista de materiales en estado provisoria.
	 */
	private void actualizarOrdenesFabricación() {
		
		//1 - Obtener todas las órdenes de fabricación en estado PROVISORIA.
		final IngenieriaServiceAsync ingenieriaService = GWT.create(IngenieriaService.class);

		ingenieriaService.filtrarOrdenesFabricacion("PROVISORIA", null, null, false, new AsyncCallback<List<OrdenFabricacionGeneralDTO>>() {
			@Override
			public void onSuccess(List<OrdenFabricacionGeneralDTO> ordenesFabricacionGeneralDTO) {

				//2 - Para cada orden de fabricación...
				for(OrdenFabricacionGeneralDTO ordenFabricacionGeneralDTO : ordenesFabricacionGeneralDTO) {
					
					boolean otroEquipoOComponenteProvisorio = false;
					
					//3 - Para cada renglon de una orden de fabricación, correspondido con un renglon de orden de pedido...
					for(RenglonOrdenPedidoDTO renglonOrdenPedidoDTO : ordenFabricacionGeneralDTO.getOrdenPedidoDTO().getRenglonOrdenPedidosDTO()) {
						
						//4- Si el equipo o componente es uno distinto a aquel con el cual estamos trabajando...
						if(!renglonOrdenPedidoDTO.getCodigo().equals(codigoTB.getText())) {
							
							//5 - Si este equipo o componente tiene su lista de materiales en estado PROVISORIA, entonces colocamos que existe otro 
							//equipo o componente que aún no tiene su lista de materiales en estado FINAL para esta orden de fabricación.
							if (renglonOrdenPedidoDTO.getEstadoListaMateriales().equals("PROVISORIA"))
								otroEquipoOComponenteProvisorio = true;
						}
					}
					
					//6 - Si no hay otros equipos o componentes cuya lista de materiales esté en estado PROVISORIA...
					if (!otroEquipoOComponenteProvisorio) {
						ordenFabricacionGeneralDTO.setEstado("GENERADA");
					
						//7 - Actualizamos el estado de la orden de fabricación a GENERADA.
						ingenieriaService.actualizarEstadoOrdenFabricacion(ordenFabricacionGeneralDTO, new AsyncCallback<Void>() {
							@Override
							public void onFailure(Throwable caught) {
								Window.alert("ERROR EN EL SERVICIO");
							}

							@Override
							public void onSuccess(Void result) {
							}
						});
					}					
				}
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
			}
		});		
	}
	
	private void guardarFinal() {
		
		listaDeMaterialesDTO.setEstado("FINAL");
		
		IngenieriaServiceAsync ingenieriaService = GWT.create(IngenieriaService.class);

		ingenieriaService.registrarListaMateriales(listaDeMaterialesDTO, new AsyncCallback<Integer>() {
			@Override
			public void onSuccess(Integer result) {
				Window.alert("La lista de materiales para " + codigoTB.getText() + " ha sido generada exitosamente.");
				actualizarOrdenesFabricación();
				salir();
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				generarBtn.setEnabled(true);
			}
		});
	}
	
	private void guardarProvisoria() {
		
		listaDeMaterialesDTO.setEstado("PROVISORIA");
		
		IngenieriaServiceAsync ingenieriaService = GWT.create(IngenieriaService.class);

		ingenieriaService.registrarListaMateriales(listaDeMaterialesDTO, new AsyncCallback<Integer>() {
			@Override
			public void onSuccess(Integer result) {
				Window.alert("La lista de materiales para " + codigoTB.getText() + " ha sido guardada exitosamente.");
				salir();
			}

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO");
				guardarBtn.setEnabled(true);
			}
		});
	}
	
	/**
	 * Método que vuelve a la pantalla inmediatamente anterior a la presente.
	 * @param event
	 */
	public void cancelar(ClickEvent event) {
					
		int ancho = Window.getClientWidth() - 15;
		int alto = Window.getClientHeight() - 13;
		
		P_DefinirListaMaterialesSeleccion p_DefinirListaMaterialesSeleccion = new P_DefinirListaMaterialesSeleccion(padre, tituloTab);
		
		this.getParent().removeFromParent();
		ScrollPanel formulario = new ScrollPanel();
		formulario.setTitle(tituloTab);
		formulario.setStyleName("panelFormulario");
		formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
		formulario.add(p_DefinirListaMaterialesSeleccion);
		padre.add(formulario, tituloTab, false);
		padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
		
		padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

		for(int i = 0; i < padre.getWidgetCount(); i++) {
			padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
	}
	
	public void salir() {
		padre.remove(Validaciones.numeroElemento(padre, tituloTab));
	}
}